package main

import (
	"fmt"
)

// 自己实现的 栈
/****************************************/

type Stack struct {
	stk []int
}

func stack() *Stack {
	return &Stack{stk: make([]int, 0)}
}

func (this *Stack) push(key int) {
	this.stk = append(this.stk, key)
}

func (this *Stack) pop() {
	this.stk = this.stk[:len(this.stk) - 1]
}

func (this *Stack) top() int {
	return this.stk[len(this.stk) - 1]
}

func (this *Stack) size() int {
	return len(this.stk)
}

func (this *Stack) empty() bool {
	return len(this.stk) == 0
}

func (this *Stack) clear() {
	this.stk = this.stk[:0]
}
/****************************************/

func main() {

	stk := stack()
	// 入栈，出栈
	stk.push(20)
	stk.push(10)
	stk.push(30)
	stk.pop();  // 弹出30
	// 返回栈顶元素
	fmt.Println(stk.top())  // 10
	// 清空 stack
	stk.clear()
	fmt.Println(stk.size())  // 0
	fmt.Println(stk.empty())  // true
}
